package gobelinmaker.server;

/**
 * Virtuális léptetőmotor alaposztálya.
 *
 * @author imruf84
 */
public final class VirtualMotorControl extends MotorControl {

    /**
     * Konstruktor.
     *
     * @param ID motor azonosítója
     * @param direction irány
     * @param initalSteps kezdőlépések száma
     */
    public VirtualMotorControl(String ID, long direction, long initalSteps) {
        super(ID, direction);
        
        // Tesztelési célból kezdőértékkel indulunk.
        this.currentSteps.set(initalSteps);
        this.currentMicroSteps.set(this.currentSteps.get() * this.getMicroStepSize() * this.getDirection());
    }

    @Override
    public long getMicroStepSize() {
        return 2;
    }

    /**
     * Apró szünet.
     *
     * @throws InterruptedException kivétel
     */
    private void sleep() throws InterruptedException {
        Thread.sleep(100);
    }

    @Override
    public void doSteps(long steps) {

        // Picit várunk a parancs végrehajtása előtt, hogy valóságosabb legyen a motor mozgása.
        try {
            Thread.sleep(100);
        } catch (InterruptedException ex) {
            System.err.println(ex.getLocalizedMessage());
        }

        final long microStepLeft = steps * getMicroStepSize() * this.getDirection();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < Math.abs(microStepLeft); i++) {
                    currentMicroSteps.addAndGet(microStepLeft < 0 ? -1 : 1);
                    currentMicroSteps.set(currentMicroSteps.get());
                    try {
                        sleep();
                    } catch (InterruptedException ex) {
                        Thread.currentThread().interrupt();
                    }
                }

                // Lépésszám frissítése.
                currentSteps.set(Math.round((float) currentMicroSteps.get() / (float) getMicroStepSize()));

            }
        }).start();

    }

    @Override
    public void stop() {
    }

}
